using System;
using System.ComponentModel;
using System.Windows.Forms;
using Infragistics.Win.UltraWinGrid;
using Alias_Infragistics_Win = Infragistics.Win;
//using Utiles.UtilInfragistics.Ctrl_UltraGrid;

//'
public class Ctrl_UltraGrid : Infragistics.Win.UltraWinGrid.UltraGrid
{
   public Ctrl_UltraGrid()      : base()
   {
      InitializeLayout += new InitializeLayoutEventHandler(Ctrl_UltraGrid_InitializeLayout); //EventHandler
      //IniciarEstandarControl(); //Ojo!! Si después el diseñador cambia propiedades del grid prevalece sobre esta llamada
   }
   //'
   #region Variables
   //
    #region                                                                bol_Dock
   private bool p_bol_Dock = true;
   /// <summary>
   /// Si se expande el grid lo máximo posible automáticamente al abrirlo. True por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si se expande el grid lo máximo posible automáticamente al abrirlo. True por defecto")]
   public bool bol_Dock
   {
      get
      {
         return p_bol_Dock;
      }
      set
      {
         p_bol_Dock = value;
      }
   }
   #endregion
   //
   #region                                                                bol_MostrarCabecera
   private bool p_bol_MostrarCabecera = false;
   /// <summary>
   /// Si muestra la cabecera de título. False por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si muestra la cabecera de título. False por defecto")]
   public bool bol_MostrarCabecera
   {
      get
      {
         return p_bol_MostrarCabecera;
      }
      set
      {
         p_bol_MostrarCabecera = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirAgrupar
   private bool p_bol_PermitirAgrupar = false;
   /// <summary>
   /// Si el grid permite agrupar o no. false por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si el grid permite agrupar o no. True por defecto")]
   public bool bol_PermitirAgrupar
   {
      get
      {
         return p_bol_PermitirAgrupar;
      }
      set
      {
         p_bol_PermitirAgrupar = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirFiltrar
   private bool p_bol_PermitirFiltrar = false;
   /// <summary>
   /// Si el grid permite filtrar filas o no. false por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si el grid permite filtrar filas o no. True por defecto")]
   public bool bol_PermitirFiltrar
   {
      get
      {
         return p_bol_PermitirFiltrar;
      }
      set
      {
         p_bol_PermitirFiltrar = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirOrdenar
   private bool p_bol_PermitirOrdenar = true;
   /// <summary>
   /// Si el grid permite ordenar o no. True por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si el grid permite ordenar o no. True por defecto")]
   public bool bol_PermitirOrdenar
   {
      get
      {
         return p_bol_PermitirOrdenar;
      }
      set
      {
         p_bol_PermitirOrdenar = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirFijar
   private bool p_bol_PermitirFijar = false;
   /// <summary>
   /// Si el grid permite fijar columnas o no. False por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si el grid permite fijar columnas o no. False por defecto")]
   public bool bol_PermitirFijar
   {
      get
      {
         return p_bol_PermitirFijar;
      }
      set
      {
         p_bol_PermitirFijar = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirEditar
   private bool p_bol_PermitirEditar = false;
   /// <summary>
   /// Si se puede editar el texto de las celdas del grid. No por defecto. False por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si se puede editar el texto de las celdas del grid. No por defecto. False por defecto")]
   public bool bol_PermitirEditar
   {
      get
      {
         return p_bol_PermitirEditar;
      }
      set
      {
         p_bol_PermitirEditar = value;
      }
   }
   #endregion
   //
   #region                                                                bol_PermitirAgregar
   private bool p_bol_PermitirAgregar = true;
   /// <summary>
   /// Si se puede agregar elementos al grid desde fuera de su datasource. Directo vaya. True por defecto
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Si se puede agregar elementos al grid desde fuera de su datasource. Directo vaya. True por defecto")]
   public bool bol_PermitirAgregar
   {
      get
      {
         return p_bol_PermitirAgregar;
      }
      set
      {
         p_bol_PermitirAgregar = value;
      }
   }
   #endregion
   //
   #region                                                                arrAutoCalculoCampos
   private string[] p_arrAutoCalculoCampos;
   /// <summary>
   /// Los campos por los cuales hay que hacer calculos.
   /// Cáculo del campo separados por || . su:suma, av:average, mi:minim, ma:maxim, co:count
   /// </summary>
   /// <value></value>
   /// <returns></returns>
   /// <remarks></remarks>
   [Category(clsVariables.str_NombreAplicacion), Description("Los campos por los cuales hay que hacer calculos. s: para suma")]
   public string[] arrAutoCalculoCampos
   {
      get
      {
         return p_arrAutoCalculoCampos;
      }
      set
      {
         p_arrAutoCalculoCampos = value;
      }
   }
   #endregion
   //
   #region Carga automática datos
   //
   #region                                                                OrigenDatos
   private string p_OrigenDatos;
   [Category(clsVariables.str_NombreAplicacion), Description("Opcional. La tabla o vista de donde el grid saca los datos al llamar Sub CargarDatos")]
   public string OrigenDatos
   {
      get
      {
         return p_OrigenDatos;
      }
      set
      {
         p_OrigenDatos = value;
      }
   }
   #endregion
   //
   #region                                                                FiltroOrigenDatos
   private string p_FiltroOrigenDatos = string.Empty;
   [Category(clsVariables.str_NombreAplicacion), Description("Opcional. El filtro que se aplica al OrigenDatos")]
   public string FiltroOrigenDatos
   {
      get
      {
         return p_FiltroOrigenDatos;
      }
      set
      {
         p_FiltroOrigenDatos = value;
      }
   }
   #endregion
   //
   #region                                                                TipoOrigen
   private clsVariables.e_TipoOrigen p_TipoOrigen = clsVariables.e_TipoOrigen.Cliente;
   [Category(clsVariables.str_NombreAplicacion), Description("Obligatorio si se informa \'OrigenDatos\'. " + "Si los datos los carga de cliente o de sistema. Por defecto cliente")]
   public clsVariables.e_TipoOrigen TipoOrigen
   {
      get
      {
         return p_TipoOrigen;
      }
      set
      {
         p_TipoOrigen = value;
      }
   }
   #endregion
   //
   #endregion
   //
   #endregion
   //'
   public void IniciarEstandarControl()
   {
      //int bol_PermitirEditarInfragistics;
      //'
      //bol_PermitirEditarInfragistics = bol_PermitirEditar ? 0 : 1;
      //Fijos
      DisplayLayout.CaptionAppearance.BackColor = System.Drawing.SystemColors.ActiveCaption;
      DisplayLayout.CaptionAppearance.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
      DisplayLayout.CaptionAppearance.ThemedElementAlpha = Alias_Infragistics_Win.Alpha.Transparent;
      DisplayLayout.MaxColScrollRegions = 1;
      DisplayLayout.MaxRowScrollRegions = 1;
      DisplayLayout.ScrollBounds = ScrollBounds.ScrollToFill; //Especifica si se debe detener el desplazamiento hacia abajo una vez que las últimas filas se hace visible
      DisplayLayout.ScrollStyle = ScrollStyle.Immediate; // Controla como se ha de acabar el scroll vertical en el grid
      //
      //Generales
      DisplayLayout.Override.CellPadding = 0; //padding
      DisplayLayout.Override.RowSelectors = Alias_Infragistics_Win.DefaultableBoolean.False; //Selector de filas
      DisplayLayout.Override.CellClickAction = CellClickAction.Edit; //.EditAndSelectText
      DisplayLayout.Override.HeaderClickAction = HeaderClickAction.SortMulti; //Permitir Orden multi(con shift pulsado)
      DisplayLayout.Override.AllowColSizing = AllowColSizing.Free; //Habilitar anchos distintos para bandas
      DisplayLayout.Override.HeaderStyle = Alias_Infragistics_Win.HeaderStyle.Default; //Quitar la cabecera tipo "otro"
      DisplayLayout.Override.RowSelectors = Alias_Infragistics_Win.DefaultableBoolean.False; //Selector de filas      
      //      
      DisplayLayout.Override.AllowDelete = Alias_Infragistics_Win.DefaultableBoolean.False;
      //.AllowUpdate = IIf(bol_PermitirEditar, DefaultableBoolean.True, DefaultableBoolean.False) 'Si hago esto después no puedo poner la seleccionar como editable
      //
      DisplayLayout.Override.HeaderStyle = Alias_Infragistics_Win.HeaderStyle.WindowsVista; // 'Títulos estilo Vista
      DisplayLayout.Override.SummaryDisplayArea = Infragistics.Win.UltraWinGrid.SummaryDisplayAreas.BottomFixed; // 'fijar la suma abajo
      DisplayLayout.Override.SummaryFooterCaptionVisible = Alias_Infragistics_Win.DefaultableBoolean.False; //Que no salga el título      
      DisplayLayout.GroupByBox.Hidden = true;
      clsControlColores.CagarColoresGrid(this); //Apariencia y colores      
   }

   //
   /// <summary>
   /// Se dispara cuando se le enlaza datos en el datasource
   /// </summary>
   /// <param name="sender"></param>
   /// <param name="e"></param>
   /// <remarks></remarks>
   public void Ctrl_UltraGrid_InitializeLayout(object sender, InitializeLayoutEventArgs e)
   {
      int bol_PermitirEditarInfragistics;
      string strTipoColumna;
      //'
      //
      //Generales
      bol_PermitirEditarInfragistics = bol_PermitirEditar ? 0 : 1;
      DisplayLayout.UseFixedHeaders = bol_PermitirFijar; //Si muestra el icono de Fijar columnas
      DisplayLayout.Override.HeaderClickAction = bol_PermitirOrdenar ? HeaderClickAction.SortMulti : HeaderClickAction.Select;
      DisplayLayout.Override.AllowAddNew = bol_PermitirAgregar ? AllowAddNew.Yes : AllowAddNew.No;
      DisplayLayout.Override.AllowDelete = Alias_Infragistics_Win.DefaultableBoolean.False;
      //.AllowUpdate = IIf(bol_PermitirEditar, DefaultableBoolean.True, DefaultableBoolean.False) 'Si hago esto después no puedo poner la seleccionar como editable
      //
      if (bol_PermitirFiltrar) //Filtro
      {
         Infragistics.Shared.ResourceCustomizer rc;
         rc = Infragistics.Win.Resources.Customizer;
         rc.SetCustomizedString("RowFilterDropDownAllItem", "(Todos)");
         rc.SetCustomizedString("RowFilterDropDownBlanksItem", "(Blancos)");
         rc.SetCustomizedString("RowFilterDropDownNonBlanksItem", "(No Blancos)");
         rc.SetCustomizedString("RowFilterDropDownCustomItem", "(Personalizado)");
         DisplayLayout.Override.FilterRowPrompt = "Filtro";
         DisplayLayout.Override.AllowRowFiltering = Alias_Infragistics_Win.DefaultableBoolean.True;
      }
      else
      { DisplayLayout.Override.AllowRowFiltering = Alias_Infragistics_Win.DefaultableBoolean.False;}
      //
      //Variables
      if (bol_PermitirAgrupar) //Agrupación
      {
         DisplayLayout.GroupByBox.Hidden = false;
         DisplayLayout.ViewStyleBand = ViewStyleBand.OutlookGroupBy; // Agrupación
         DisplayLayout.GroupByBox.Prompt = "Arrastre aquí una columna para agrupar por ella"; //Mensaje agrupación
      }
      else
      {DisplayLayout.GroupByBox.Hidden = true;}
      //
      Dock = bol_Dock ? DockStyle.Fill : DockStyle.None;
      DisplayLayout.CaptionVisible = bol_MostrarCabecera ? Alias_Infragistics_Win.DefaultableBoolean.True : Alias_Infragistics_Win.DefaultableBoolean.False;
      //
      //Poner columnas en modo no editable excepto seleccionar si lo tiene
      //TODO!Quitar esto del grid general por Dios. Solo debe ir en el navegador
      foreach (UltraGridColumn col in DisplayLayout.Bands[0].Columns)
      {
         if (col.Header.Caption == "Seleccionar")
         {
            col.SortIndicator = SortIndicator.None;
            //col.Header.FixedHeaderIndicator = FixedHeaderIndicator.None;
            col.Header.Fixed  = true;
            col.Style = Infragistics.Win.UltraWinGrid.ColumnStyle.CheckBox;
            col.CellActivation = Activation.AllowEdit;                       
            col.Header.VisiblePosition = 0;
            //.CellClickAction = CellClickAction.Edit
            //.CellAppearance.BackColor = Color.Khaki
            //.Header.Caption = "Seleccionar" 'titulo columna
            col.Width = 80; //ancho
         }
         else
         {
            //col.Header.Fixed = false;
            col.CellActivation = (Alias_Infragistics_Win.UltraWinGrid.Activation)bol_PermitirEditarInfragistics; //Activation.ActivateOnly 'Desactivo editación
            strTipoColumna = col.DataType.Name.ToLower();
            if (strTipoColumna == "integer " || strTipoColumna == "double" || strTipoColumna == "decimal" || strTipoColumna == "int32" || strTipoColumna == "int16")
            {
               col.CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right;
            }
         }
      }
      //
      if (arrAutoCalculoCampos != null && arrAutoCalculoCampos.Length > 0)
      {
         string strTipoCalculo = string.Empty;
         string ugCNombre = string.Empty;
         foreach (string strEl in arrAutoCalculoCampos)
         {
            strTipoCalculo = strEl.ToLower().Substring(0, 3);
            ugCNombre = strEl.Replace(strTipoCalculo, "");
            DisplayLayout.Bands[0].Columns[ugCNombre].AllowRowSummaries = AllowRowSummaries.True;
            switch (strTipoCalculo)
            {
               case "av:":
                  Utiles.UtilInfragistics.Ctrl_UltraGrid.AgregarQuitarCalculoColumna(this, ugCNombre, SummaryType.Average);
                  break;
               case "co:":
                  Utiles.UtilInfragistics.Ctrl_UltraGrid.AgregarQuitarCalculoColumna(this, ugCNombre, SummaryType.Count);
                  break;
               case "mi:":
                  Utiles.UtilInfragistics.Ctrl_UltraGrid.AgregarQuitarCalculoColumna(this, ugCNombre, SummaryType.Minimum);
                  break;
               case "ma:":
                  Utiles.UtilInfragistics.Ctrl_UltraGrid.AgregarQuitarCalculoColumna(this, ugCNombre, SummaryType.Maximum);
                  break;
               case "su:":
                  Utiles.UtilInfragistics.Ctrl_UltraGrid.AgregarQuitarCalculoColumna(this, ugCNombre, SummaryType.Sum);
                  break;
               default:
                  throw (new Exception("<Ctrl_UltraGrid_InitializeLayout> Tipo no definido de calculo de columna: " + strTipoCalculo));
                  //break;
            }
         }
      }
     //
      //clsControlColores.CagarColoresGrid(this); //Apariencia y colores
      //
   }
   //'
   public void ulg_ActualizarCelda(System.Object sender, CellEventArgs e) //, Me.CellChange
   {
      // ActualizarCelda(sender, e) 'Me da más problemas q otra cosa
   }
   //'
   private void ActualizarCelda(System.Object sender, CellEventArgs e)
   {
      //Verificar las instancias
      if (e != null && e.Cell != null && e.Cell.Row != null)
      {
         if (e.Cell.IsInEditMode)
         {
            PerformAction(UltraGridAction.ExitEditMode);
            PerformAction(UltraGridAction.CommitRow);
            //PerformAction(UltraGridAction.EnterEditMode) '.EnterEditModeAndDropdown
            //'e.Cell.SelLength = 0 : e.Cell.SelStart = Len(e.Cell.ToString)
         }
      }
   }
   //'
   public void ulg_ActualizarCelda(System.Object sender, Infragistics.Win.UltraWinGrid.BeforeRowsDeletedEventArgs e)
   {
      Infragistics.Win.UltraWinGrid.BeforeRowsDeletedEventArgs with_1 = e;
      with_1.DisplayPromptMsg = false; //Fuera aviso de advertencia de borrado de línea
      with_1.Cancel = false; //Permite borra linea
   }
   //'
   /// <summary>
   /// Carga datos automáticamente cogiendo el 'origen datos', 'filtro datos' (opcional) y el 'tipo origen' del grid
   /// </summary>
   /// <remarks></remarks>
   public void CargarDatos()
   {
      if (!string.IsNullOrEmpty(OrigenDatos))
      {
         DataSource = clsBBDD.DtObtener(string.Format("Select * From {0} Where 1=1 {1}", OrigenDatos, FiltroOrigenDatos), TipoOrigen, false);
      }
   }
   //'
}

